前言
今天学习怎么自己编译 OpenJDK,选择了 LTS 的 jdk11 版本。动机是之前学习了一个大佬的修 Bug 过程,其中用到了自己编译的 JDK 来输出原本 JDK 不会输出的报错信息,于是今天学习一下以作积累。
前期工作
系统环境:macOS Catalina 10.15.2
安装 Xcode 和 Command line tools,只有 Command line tools 是不够的,不安装的话报错信息记录在见下文编译过程:
1
2# 安装 Command line tools
xcode-select --install安装 Homebrew,然后安装 OpenJDK 的依赖 freetype,安装 ccache 提升编译速度:
1
2
3
4
5
6# 安装 Homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
# 安装依赖
brew install autoconf
brew install freetype
brew install ccache安装 XQuartz。X11 是 Unix 类 OS 使用的图形系统,10.8 以前的 OS X 是自带的,但是从此以后就不自带了。对应于 Mac,你需要装 XQuartz,这个没有版本限制,去网上下最新版即可。装这个的原因是当时在编译 PolicyTools 的时候出现了如下错误:
1
ld: library not found for -lX11
编译过程
下载 OpenJDK11 源码 http://jdk.java.net/,选择 11 版本:
运行自带的 configure,注意这里需要一个 Bootstrap JDK,如果需要编译版本为
N
的OpenJDK,那么 Bootstrap JDK 的版本应不低于N-1
,注意一定要带上--disable-warnings-as-errors
,不然会把警告当做错误就无法继续编译了:1
bash ./configure --with-debug-level=slowdebug --with-boot-jdk=/Library/Java/JavaVirtualMachines/jdk-11.0.5.jdk/Contents/Home --with-target-bits=64 --enable-ccache --disable-warnings-as-errors --with-boot-jdk-jvmargs="-Xlint:deprecation -Xlint:unchecked"
配置成功信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22A new configuration has been successfully created in
/Users/Ryan/code/c/openjdk11/build/macosx-x86_64-normal-server-slowdebug
using configure arguments '--with-debug-level=slowdebug --with-boot-jdk=/Library/Java/JavaVirtualMachines/jdk-11.0.5.jdk/Contents/Home --with-target-bits=64 --enable-ccache --disable-warnings-as-errors --with-boot-jdk-jvmargs='-Xlint:deprecation -Xlint:unchecked''.
Configuration summary:
* Debug level: slowdebug
* HS debug level: debug
* JVM variants: server
* JVM features: server: 'aot cds cmsgc compiler1 compiler2 dtrace epsilongc g1gc graal jfr jni-check jvmci jvmti management nmt parallelgc serialgc services vm-structs'
* OpenJDK target: OS: macosx, CPU architecture: x86, address length: 64
* Version string: 11-internal+0-adhoc.ryan.openjdk11 (11-internal)
Tools summary:
* Boot JDK: java version "11.0.5" 2019-10-15 LTS Java(TM) SE Runtime Environment 18.9 (build 11.0.5+10-LTS) Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.5+10-LTS, mixed mode) (at /Library/Java/JavaVirtualMachines/jdk-11.0.5.jdk/Contents/Home)
* Toolchain: clang (clang/LLVM from Xcode 11.3)
* C Compiler: Version 11.0.0 (at /usr/bin/clang)
* C++ Compiler: Version 11.0.0 (at /usr/bin/g++)
Build performance summary:
* Cores to use: 8
* Memory limit: 16384 MB
* ccache status: Active (3.7.5)
开始编译:
make all
。(以下这个问题在编译 OpenJDK8 时候遇到,由于编译 OpenJDK11 的时候这些文件已经加上,所以不确定会不会引起这个问题)
Xcode10 移除了GCC的 stdc++,于是遇到问题:
1
2> error: include path for stdlibc++ headers not found; pass ‘-std=libc++’ on the command line to use the libc++ standard library instead
>把编译命令改成:
make all -stdlib=libc++
,还是失败……最后还是从网上搞来了 Xcode 9 中的相关文件,放入到 Xcode 文件夹的相同路径:https://segmentfault.com/q/1010000017752615。完成编译:
1
2Creating jdk image
Finished building target 'all' in configuration 'macosx-x86_64-normal-server-slowdebug'
我用了 jenv
来管理 Java 版本,将编译好的 OpenJDK11 加入到 jenv 中:
1 | jenv add /Users/Ryan/code/c/openjdk11/build/macosx-x86_64-normal-server-slowdebug/jdk |
然后切换到 OpenJDK:
1 | jenv local openjdk64-11-internal |
查看 Java 版本 java -version
:
1 | openjdk version "11-internal" 2018-09-25 |
达到预期效果,编译成功。
后续更新使用自己编译的 OpenJDK 进行 Debug 的方法~